package day20;

import java.io.*;
import java.net.Socket;

//本类用于处理客户端发来的请求并给出响应
public class ClientHandler {
    private  Socket socket;

    public ClientHandler(Socket socket) {
        this.socket = socket;
    }
    //定义自定义方法2，用来处理客户端发来的请求并给出响应
    public void run() throws IOException {
        File file = new File("./index.html"); //创建一个文件对象，表示路径下的响应文件
        //因为服务器要输出响应给客户端，所以需要从套接字处获得输出流
        OutputStream output = socket.getOutputStream();
        //准备响应状态行，与响应状态头
        String data = "HTTP/1.1 200 OK\r\n"+
                "Content-Type: text/html\r\n"+
                "Content-Length:"+file.length()+"\r\n"+"\r\n";
        //将响应的数据输出
        output.write(data.getBytes());
        FileInputStream input = new FileInputStream(file);
        int d = 0;
        while((d=input.read())!=-1){
            output.write(d);
        }
    }

    //定义方法哦你过来处理客户端发来的请求并给出响应

    public void run1() throws IOException {
        while(true) {
            //多次调用自定义的读取一行的方法
            String line = readline();
            if(line.isEmpty()) {
                break;
            }
            System.out.println(line);
        }


    }

    //因为读取一行的工作要反复使用，所以我们可以把刚刚读取一行的逻辑提取出来变成一个方法，多次调用
    private String readline() throws IOException {
        InputStream inputStream = socket.getInputStream(); //从构造方法赋值传来的套接字对象中获取客户端输入流
        //定义变量用来获取每次实际读取的内容
        int d = 0;
        char cur = 'a';   //存储本次读取到的字符
        char pre = 'a';   //存储1上次读取到的字符
        StringBuilder stringBuilder = new StringBuilder();  //准备字符串拼接工具
        while ((d = inputStream.read()) != -1) {  //只要还有内容就要一直读取
            cur = (char)d;
            //每读取一个字符，就要确认是否是当前行的最后（要看有没有回车换行）
            if (pre  ==13 && cur ==10){  //如果前面字符是回车，后面是换号，就认为当前行结束
                break;
            }
            //7拼接读取到字符
            stringBuilder.append(cur);
            //8将本次读取到的对象，给pre
            pre = cur;
        }
        //循环结束，说明当前行已读取完毕，将stringBuilder中的内容打印出来
        String line = stringBuilder.toString().trim();
        return line;

    }
}
